<?php

namespace app\common\traits;

use Closure;
use think\facade\Log;

/**
 *
 * Trait JobRetryTraits
 * @package app\common\traits
 */
trait JobRetryTraits
{
    /**
     * 重试直到满足做大次数
     * @param $job
     * @param int $maxAttempts 最大重试次数
     * @param Closure|null $func 延迟算法
     * @param string $error 停止后的报错日志
     * @param string $notice 发生重试的日志
     * @return void
     */
    private function retryUntilMaxAttempts($job, int $maxAttempts, ?Closure $func = null, string $error = '', string $notice = '')
    {
        $attempts = $job->attempts();

        if ($attempts >= $maxAttempts) {
            // 停止重试并记录错误日志

            if (not_blank($error)) {
                Log::error($error);
            }

            $job->delete();
        } else {
            // 继续重试

            if ($func) {
                $delay = $func($attempts);
            } else {
                $delay = $attempts * 3600;
            }

            if (not_blank($notice)) {
                Log::notice($notice);
            }

            $job->release($delay);
        }
    }

}